การประมวลผลแบบขนานบนดาวอังคารคือศิลปะในการจัดการงานที่เป็นอิสระหลายอย่าง เช่น การนำทางของยานสำรวจ การส่งข้อมูลชีวภาพ และการเชื่อมต่อสัญญาณดาวเทียม โดยไม่ให้ระบบหยุดชะงัก ในภาษา Go งานที่ทำงานอิสระ งานที่ทำงานอิสระ เรียกว่า goroutine។
1. หลักการไม่แน่นอน
ควรสมมุติเสมอว่าการทำงานใน goroutine ต่างกันนั้น อาจทำงานในลำดับใดก็ได้เนื่องจากระบบปฏิบัติการของ Go จัดตารางงานไปยังคอร์ที่มีอยู่ จึงไม่สามารถพึ่งพาการสแกนของยานสำรวจหนึ่งตัวจะเสร็จก่อนที่อีกยานหนึ่งจะเริ่มส่งข้อมูลได้ หากไม่มีการประสานงานอย่างชัดเจน
go printGopher(c) // เปิดงานอิสระใหม่
2. กลไกการประสานงาน
เพื่อจัดการงานเหล่านี้ ภาษา Go ให้เครื่องมือหลักสองอย่าง:
- การยกเลิกการเข้าถึงร่วมกัน: goroutine สามารถใช้
mutexเพื่อป้องกันไม่ให้แต่ละตัวทำอะไรบางอย่างพร้อมกัน - คำสั่ง select: ดูเหมือนคำสั่ง switch ที่แต่ละกรณีเก็บการรับหรือการส่งผ่านช่องสัญญาณ (channel)
selectรอจนกว่ากรณีหนึ่งจะพร้อมแล้วจึงดำเนินการ
3. โครงสร้างของงานที่ทำงานตลอดเวลา
งานที่ทำงานนานๆ มักจะใช้ลูปแบบไม่สิ้นสุดร่วมกับ select เพื่อตรวจสอบช่องสัญญาณการสื่อสารหลายช่องพร้อมกัน:
func worker() {
for {
select {
// รอช่องสัญญาณที่นี่
}
}
}
for {
select {
// รอช่องสัญญาณที่นี่
}
}
}
TERMINALbash — 80x24
> Ready. Click "Run" to execute.
>